#!/usr/bin/perl -w

use strict;                   # 'strict' insists that all variables be declared
use diagnostics;              # 'diagnostics' expands the cryptic warnings
use utf8;
use Encode;

require 'bin/perlwikipedia_utils.pl';
require 'bin/get_html.pl';

my  @Months=("január", "február", "március", "április", "május", "június",
	     "július", "augusztus",  "szeptember", "október", "november", "december");


my (%kw, %qnewkw, %works, %days, $huwiki);
my ($kw_pre, $kw_after);
my ($gykw_pre, $gykw_after);
my ($today, $archive_to);

sub tudakozo_daily_archive{
	my ($continue, $log, $wikilog, $comment);
	
	$continue = 1;
	$log = "AsgardBot: Tudakozó napi frissítése - napló\n";
	$log = $log . "Kezdés ideje: " . current_date("txt");
	$wikilog = "==Tudakozó napi frissítés naplója (" . current_date("date4kw") . ")==";
	
	$huwiki=&wikipedia_login("Botneve");
	
	($log, $wikilog, $continue) = &get_yesterday_information($continue, $log, $wikilog);
	($log, $wikilog, $continue) = &was_archived_today($continue, $log, $wikilog);
	($log, $wikilog, $continue) = &initilaize_keywords($continue, $log, $wikilog);
	($log, $wikilog, $continue) = &load_current_keywords($continue, $log, $wikilog);
	($log, $wikilog, $continue) = &save_keywords($continue, $log, $wikilog);
	($log, $wikilog, $continue) = &put_on_pages($continue, $log, $wikilog);
	($log, $wikilog, $continue) = &archive_now($continue, $log, $wikilog);
	($log, $wikilog, $continue) = &update_archive_time($continue, $log, $wikilog);
	
	open(FILE, ">log.txt");
	print FILE $log;
	close(FILE);
	
	$comment = encode("utf-8", "Bot: Tudakozó " . current_date("") . "-i archiválásának naplója");
	&wikipedia_submit($huwiki, "User:Dani/tudlog", $comment, $wikilog, 2, 2);
	open(FILE, ">wikilog.txt");
	print FILE $wikilog;
	close(FILE);
}


sub get_yesterday_information {
	my ($continue, $log, $wikilog, $text, $error, $line);
	
	$continue = shift;
	$log = shift;
	$wikilog = shift;
	
	if ($continue==1) {
		$text=&wikipedia_fetch($huwiki, "User:Dani/kulcsszavak1", 5, 2);
		foreach $line (split ("\n", $text)) {
			if ($line =~ /tegnap\((\d{4}-\d{2}-\d{2})\)/i ){
				$archive_to=$1;
			} elsif ($line =~ /(tegnape+)\((\d{4}-\d{2}-\d{2})\)/i ){
				print $1 . "     " . $2;
				$days{$1}=$2;
			}
		}
	}
	
	if ($continue==1){
		return ($log . "\n" . current_date("time") . " Előző nap lekérése a hu.wikiről: sikeresen megtörtént - $archive_to.",
				$wikilog . "\n{{/elozonap|y}}",
				$continue);
	} else {
	    return ($log . "\n" . current_date("time") . " Előző nap lekérése a hu.wikiről: nem sikerült.",
				$wikilog . "\n{{/elozonap|n}}",
				$continue);
	}
}


sub was_archived_today {
	my ($continue, $log, $wikilog, $archive_to, $todayy);
	
	$continue = shift;
	$log = shift;
	$wikilog = shift;
	
	if ($continue==1){
		$todayy = current_date("date4kw");
	
		if ($archive_to eq $todayy) {
			$continue=0;
		}
	}

	if ($continue==1){
		return ($log . "\n" . current_date("time") . " Ellenőrzés: ma még nem történt archiválás.",
				$wikilog . "\n{{/napcheck|y}}",
				$continue, $archive_to);
	} else {
	    return ($log . "\n" . current_date("time") . " Ellenőrzés: ma már történt archiválás!",
				$wikilog . "\n{{/napcheck|n}}",
				$continue, 0);
	}
}

sub initilaize_keywords {
	my ($continue, $log, $wikilog);
	my ($kw_old, $list, $utfkey, $line, $kw_count);
	
	$continue = shift;
	$log = shift;
	$wikilog = shift;
	
	$kw_count=0;
	
	if ($continue==1) {
		
		$kw_old=&wikipedia_fetch($huwiki, "Wikipédia:Tudakozó/Archívum/Gyakori kulcsok", 5, 2);
    
		if ($kw_old =~ /(.*Innen következik a kulcsszavak listája. A listát egy bot frissíti, ezért semmiképpen se módosíts rajta! -->)(.*?)(<!-- Kulcsszavak listájának vége!.*)/s) {
			$gykw_pre=$1;
			$gykw_after=$3;
		}
	
	
		$kw_old=&wikipedia_fetch($huwiki, "Wikipédia:Tudakozó/Archívum/Kulcsok", 5, 2);
    
		if ($kw_old =~ /(.*Innen következik a kulcsszavak listája. A listát egy bot frissíti, ezért semmiképpen se módosíts rajta! -->)(.*?)(<!-- Kulcsszavak listájának vége!.*)/s) {
			$kw_pre=$1;
			$list=$2;
			$kw_after=$3;
		
			foreach $line (split ("\n", $list)) {
		    
				next unless ($line =~ /.*\{\{kulcsszó-lista\|(.*?)\|(.*?)\}\}.*/i);
				$utfkey = $1;
				#utf8::encode($utfkey);
				$kw{$utfkey}=$2;
				$kw_count=$kw_count + 1;
			}
					
		}
		
	}
	
	if ($kw_count>0){
		return ($log . "\n" . current_date("time") . " Meglévő kulcsszavak betöltése: sikeresen megtörtént, $kw_count darab.",
				$wikilog . "\n{{/kszleker|y}}",
				$continue);
	} else {
		$continue=0;
	    return ($log . "\n" . current_date("time") . " Meglévő kulcsszavak betöltése: nem sikerült.",
				$wikilog . "\n{{/kszleker|n}}",
				$continue);
	}
}


	sub add_keywords {
		my $keyword;
		my $line;
		
		$keyword = shift;
		
		foreach $line (split (",", $keyword)) {
			#print $line."\n";
			next unless ($line =~ /\s*\[\[(.*?)(\|.*?)?\]\]\s*/i);
			next if ($1 eq "");
			next if ($1 eq ":Kategória:");
			
			if (!exists $kw{$1}) {
				$kw{$1}=1;
				$qnewkw{$1}=$1;
			} else {
				$kw{$1}=$kw{$1} + 1;
			}
		}
	}


sub load_current_keywords {
	my ($continue, $log, $wikilog);
	my ($tud_akkori, $line, $kw_i);
	
	$continue = shift;
	$log = shift;
	$wikilog = shift;
	
	if ($continue==1) {
		$tud_akkori=&wikipedia_fetch($huwiki, "Wikipédia:Tudakozó/Archívum/" . $days{"tegnapeee"}, 5, 2);
	
		foreach $line (split ("\n", $tud_akkori)) {
			next unless ($line =~ /.*\{\{kulcs\|(.*?)\}\}.*/i);
			$kw_i=$1;
			&add_keywords($kw_i);
		}
	}
	
	if ($continue==1){
		return ($log . "\n" . current_date("time") . " A négy nappal ezelőtti kulcsszavak betöltése: sikeresen megtörtént.",
				$wikilog . "\n{{/kszogy|y}}",
				$continue);
	} else {
	    return ($log . "\n" . current_date("time") . " A négy nappal ezelőtti kulcsszavak betöltése: nem sikerült.",
				$wikilog . "\n{{/kszogy|n}}",
				$continue);
	}
}


sub save_keywords {
	my ($continue, $log, $wikilog, $kw_new, $kw_, $comment);
	
	$continue = shift;
	$log = shift;
	$wikilog = shift;
	
	if ($continue==1) {
		$kw_new=$kw_pre . "\n";
		foreach $kw_ (sort {$kw{$b} cmp $kw{$a}} keys %kw){
			$kw_new = $kw_new . "\{\{kulcsszó-lista\|" . $kw_ . "\|" . $kw{$kw_} . "\}\}\n";
		}
	
		$kw_new=$kw_new . $kw_after;
	
		$comment = encode("utf-8", "Bot: Tudakozó kulcsszavainak frissítése");
		&wikipedia_submit($huwiki, "Wikipédia:Tudakozó/Archívum/Kulcsok", $comment, $kw_new, 2, 2);
		
		$kw_new=$gykw_pre . "\n";
		foreach $kw_ (sort {$kw{$b} cmp $kw{$a}} keys %kw){
			if ($kw{$kw_}>3){
				$kw_new = $kw_new . "\{\{kulcsszó-lista\|" . $kw_ . "\|" . $kw{$kw_} . "\}\}\n";
			}
		}
		
		$kw_new=$kw_new . $gykw_after;
		
		$comment = encode("utf-8", "Bot: Tudakozó kulcsszavainak frissítése");
		&wikipedia_submit($huwiki, "Wikipédia:Tudakozó/Archívum/Gyakori kulcsok", $comment, $kw_new, 2, 2);
	}
	
	if ($continue==1){
		return ($log . "\n" . current_date("time") . " A négy nappal ezelőtti kulcsszavak elmentése: sikeresen megtörtént.",
				$wikilog . "\n{{/kszelment|y}}",
				$continue);
	} else {
	    return ($log . "\n" . current_date("time") . " A négy nappal ezelőtti kulcsszavak elmentése: nem sikerült.",
				$wikilog . "\n{{/kszelment|n}}",
				$continue);
	}
}


sub put_on_pages {
	my ($continue, $log, $wikilog);
	my ($art, $text, $hasct, $newart, $line, $comment);
	
	$continue = shift;
	$log = shift;
	$wikilog = shift;
	
	foreach $art (sort {$qnewkw{$b} cmp $qnewkw{$a}} keys %qnewkw){
		unless ($art=~ /:/){
			$text=&wikipedia_fetch($huwiki, "Vita:".$art, 1, 1);
			$newart="";
			unless ($text =~ /\{\{\s*[Tt]udakozó-utal\s*\}\}/ || $text =~ /s*[Tt]udakozó-utal\s*=\s*/) {
			
				$hasct=0;
			
				foreach $line (split ("\n", $text)) {
					print $line."\n";
					if ($line =~ /^\s*{{\s*[cC]ikktörténet\s*$/ ) {
						$line = $line . "\n\|tudakozó-utal=igen";
						$newart = $newart . $line . "\n";
						$hasct=1;
					} elsif ($line =~ /^\s*{{\s*[cC]ikktörténet\s*\|\s*$/ ) {
						$line = $line . "\ntudakozó-utal=igen\|";
						$newart = $newart . $line . "\n";
						$hasct=1;
					} elsif ($line =~ /^\s*{{\s*[cC]ikktörténet.*?$/ ) {
						$line = $line . "\n|tudakozó-utal=igen\|";
						$newart = $newart . $line . "\n";
						$hasct=1;
					} else { $newart = $newart . $line . "\n"; }
				}
			
				unless ($hasct==1){
					$newart = '{{tudakozó-utal}}' . "\n\n" . $newart;
				}
				$comment = encode("utf-8", "Bot: Tudakozóra való hivatkozás elhelyezése");
				&wikipedia_submit($huwiki, "Vita:".$art, $comment, $newart, 1, 1);
		
			} else {
				print "A lapon mar van sablon. Kihagyas...\n\n";
			}
		} else {
			print "A lap nem a fo nevterben van. Kihagyas...\n\n";
		}
		 
	}
	
	
	if ($continue==1){
		return ($log . "\n" . current_date("time") . " Tudakozó-hivatkozások sikeresen elhelyezve.",
				$wikilog,
				$continue);
	} else {
	    return ($log . "\n" . current_date("time") . " Tudakozó-hivatkozások elhelyezése: nem sikerült.",
				$wikilog,
				$continue);
	}
}


sub archive_now {
	my ($continue, $log, $wikilog);
	my ($tud_mostani, $comment);
	
	$continue = shift;
	$log = shift;
	$wikilog = shift;
	
	if ($continue==1) {
		$tud_mostani=&wikipedia_fetch($huwiki, "Wikipédia:Tudakozó/Archívum/Most", 5, 2);
		$comment = encode("utf-8", "Bot: Tudakozó " . current_date("") . "-i archiválása");
		&wikipedia_submit($huwiki, "Wikipédia:Tudakozó/Archívum/" . $archive_to, $comment, $tud_mostani, 2, 2);
		&wikipedia_submit($huwiki, "Wikipédia:Tudakozó/Archívum/Most", $comment, '<noinclude>{{Tudakozó-keretes}}</noinclude>', 2, 2);
	}
	
	if ($continue==1){
		return ($log . "\n" . current_date("time") . " Napi archiválás sikeresen megtörtént.",
				$wikilog . "\n{{/arch|y}}",
				$continue);
	} else {
	    return ($log . "\n" . current_date("time") . " Napi archiválás nem sikerült.",
				$wikilog . "\n{{/arch|n}}",
				$continue);
	}
}


sub update_archive_time {
	my ($continue, $log, $wikilog, $comment);
	my $dates;
	
	$continue = shift;
	$log = shift;
	$wikilog = shift;
	
	$dates="tegnapeee(". $days{"tegnapee"} . ")\n" .
		   "tegnapee(". $days{"tegnape"} . ")\n".
		   "tegnape(". $archive_to . ")\n".
		   "tegnap(". current_date("date4kw") . ")\n";
	
	if ($continue==1) {
		$comment = encode("utf-8", "Bot: Tudakozó utolsó archiválási idejének frissítése");
		&wikipedia_submit($huwiki, "User:Dani/kulcsszavak1", $comment, $dates, 2, 2);
	}
	
	if ($continue==1){
		return ($log . "\n" . current_date("time") . " Tudakozó utolsó archiválási idejének frissítése sikeresen megtörtént.",
				$wikilog . "\n{{/updut|y}}",
				$continue);
	} else {
	    return ($log . "\n" . current_date("time") . " Tudakozó utolsó archiválási idejének frissítése nem sikerült.",
				$wikilog . "\n{{/updut|n}}",
				$continue);
	}
}


sub current_date {
	my ($format)=@_;
	my ($year);
	my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = gmtime();
  
	$year = 1900 + $yearOffset;
	if ($hour==23) {
		$hour = 0;
	} else {
		$hour = $hour + 1;
	}
	
	if ($minute<10) {
		$minute = "0" . $minute;
	}
	
	if ($second<10) {
		$second = "0" . $second;
	}
  
	if ($format eq "txt"){
		return "$year. $Months[$month] $dayOfMonth. $hour:$minute:$second";
	} elsif ($format eq "time"){
		return "$hour:$minute:$second";
	} elsif ($format eq "date4kw"){
		$month = $month + 1;
		if ($month <10) { $month = "0" . $month; }
		if ($dayOfMonth <10) { $dayOfMonth = "0" . $dayOfMonth; }
		return "$year-$month-$dayOfMonth";
	} else {
		return "\[\[$year\]\]. \[\[$Months[$month] $dayOfMonth\]\]";
	} 
}

1;